#ifndef REQUESTS_H
#define REQUESTS_H

#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QEventLoop>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <vector>

//数据库表结构体
using namespace std;
//登录信息
struct UserInfo{
    int uid;
    int type;
    int ok;
    int last_planid;
    QString msg;
};

//词书
struct WordBook{
    QString word;
    QString translation;
    QString sentence;
};

//学习计划
struct Plan{
    int pid;
    QString bookname;
    QString create_time;
    QString edit_time;
    int total_num;
    int remain_num;
    int everyday_num;
    int day_remain_num;
};

//词书管理表
struct Book{
    int bid;
    QString bookname;
    int creator;
    int total_num;
};

//习题
struct Exercise{
    int exid;
    QString word;
    QString question;
    QString choice_A;
    QString choice_B;
    QString choice_C;
    QString choice_D;
    QString answer;
    int creator;
    QString username;
    QString create_time;
    QString edit_time;
    int approve;
};

//笔记
struct Note{
    int nid;
    QString word;
    QString content;
    int creator;
    QString username;
    QString create_time;
    QString edit_time;
    int approve;
};

//数据库请求类
class Requests
{
private:
    QNetworkRequest request;
    QString baseUrl = "http://165.22.103.26:8001/api/";
    // QString baseUrl = "http://127.0.0.1:8000/api/";
    QNetworkAccessManager *manager=new QNetworkAccessManager;

    QString get(QString url);
    QString post(QString url, QByteArray data);
public:
    Requests();
    QString test();

    QString signup(QString username,QString pwd);   //    注册 返回uid 0表示错误
    UserInfo login(QString username,QString pwd);    //     登录 返回uid 0表示错误
    vector<WordBook> *loadplan(int pid);       //   下载需要学习的内容
    int addplan(int uid,int bid,int everyday_num);  //    新建计划 返回pid 0表示错误
    vector<Plan> *getplanlist(int uid);  // 返回该用户的所有计划表
    int updateplan(int pid,int everyday_num);  //       修改计划  返回0表示错误
    int synclearning(int pid,QString word,int ignore);    //        同步学习计划  返回0表示错误

    vector<Book> *getbooklist();  // 返回所有词书列表
    int addexercise(Exercise &exercise);  //    新增题目 输入的结构体必须包含[word,question,choice,answer,creator] 返回exid 0表示错误
    int addnote(Note &note);  //    新增笔记 输入的结构体必须包含[word,content,creator] 返回nid 0表示错误
    int updatenote(Note &note);  //    修改笔记 输入的结构体必须包含[nid,content] 返回 0表示错误
    vector<Note> *getnotebyuser(int uid,QString word);  // 返回该用户关于该单词的所有笔记
    vector<Note> *getnotebyword(QString word);  // 返回关于该单词的所有笔记

    int checknote(int nid, int approve);     //     提交审核笔记结果
    int checkexercise(int exid, int approve);     //    提交审核习题结果

    vector<Exercise> *loadexercise(int pid);  // 获取习题 输入计划pid，返回该计划中所有已学单词的相关习题
    vector<Exercise> *getuncheckedexercise();  // 获取未审核习题 返回该计划中所有未审核习题
    vector<Note> *getuncheckednote();  // 获取未审核笔记 返回该计划中所有未审核笔记

    vector<int> *checkinrecord(int pid);  //获得此计划的打卡记录
    vector<WordBook> *loadreview(int pid);       //   下载需要复习的内容
    Plan getplaninfo(int pid);  // 返回该计划详细内容
};

#endif // REQUESTS_H
